學習率(learning rate)
- 學習率為控制模型中梯度下降的速度,也有人稱為步長。
- 公式:新權重 = 舊權重 - 學習率 * 梯度
- learning rate的設置很重要,一般大家都依照經驗去設置初始learning rate,0.01-0.001,但這也沒有一定哪個比較好,都得去嘗試。
- 當learning rate設置過小時,會導致模型學習收斂較慢,且容易過擬合。而設置過大時,會容易導致模型學習過快,無法收斂,容易震盪甚至發散。如下圖。圖片來源:https://gino6178.medium.com/%E6%A8%A1%E5%9E%8B%E5%A3%93%E7%B8%AE%E5%8F%8A%E5%84%AA%E5%8C%96-learning-rate-c340a0b940e4
圖片來源:https://blog.csdn.net/u012526436/article/details/90486021
固定學習率
等間隔調整學習率:StepLR
多間隔調整學習率:MultiStepLR
-
與StepLR不同在於,不是固定的step_size,可設定list,如第[10,30,60]個epoch調整學習率。
torch.optim.lr_sheduler.MultiStepLR(optimizer, milestones, gamma=0.1, last_epoch=-1)
- optimizer:選擇搭配的優化器。
- milestones:與stepLR不同於用list表示,而非固定的step_size,如[10,30,60]。
- gamma:若gamma=0.1,初始學習率=0.1,則過了第10個epoch後的學習率會是學習率*0.1,以此類推。
- last_epoch:設置到哪個epoch就不再調整,預設為-1,到最後個epoch才會從初始學習率開始。
- verbose:預設為False,若為True,則會印出當前學習率。
圖片來源:https://www.jianshu.com/p/26a7dbc15246
指數衰減學習率:ExponentialLR
-
學習率依指數型衰減,學習率衰減公式為lr = lr * (gamma^epoch)
torch.optim.lr_sheduler.ExponentialLR(optimizer, gamma, last_epoch)
- optimizer:選擇搭配的優化器。
- gamma:假設為0.9,則每個epoch的學習率為0.9^epoch。
- last_epoch:設置到哪個epoch就不再調整,預設為-1,到最後個epoch才會從初始學習率開始。
- verbose:預設為False,若為True,則會印出當前學習率。
圖片來源:https://www.jianshu.com/p/26a7dbc15246
CosineAnnealingLR
-
設置的最初始化及最小學習率,依照cosine週期衰減,直到T-max週期到了,又開始往上增加學習率。
torch.optim.lr_sheduler.CosineAnnealingLR(optimizer, T_max, eta_min=0, last_epoch=-1)
- optimizer:選擇搭配的優化器。
- T_max:一個cosine的週期,若設為8,即為第8個epoch的學習率會降至你設置的eta_min。然後再慢慢回到你設置的初始學習率。
- eta_min:最小學習率。
- last_epoch:設置到哪個epoch就不再調整,預設為-1,到最後個epoch才會從初始學習率開始。
- verbose:預設為False,若為True,則會印出當前學習率。
圖片來源:https://zhuanlan.zhihu.com/p/261134624
CosineAnnealingWarmRestarts
- 與CosineAnnealing相似,差別在於週期可設置,不會是固定的T-max。
torch.optim.lr_scheduler.CosineAnnealingWarmRestarts(optimizer, T_0, T_mult=1, eta_min=0, last_epoch=-1, verbose=False)
- optimizer:選擇搭配的優化器。
- T_0:設置第一次回到初始學習率的epoch
- T_mult:若設定為x,T_0設置為y,則回到初始學習率的週期會是第x^0 * y個epoch、第[( x^0 )+( x^1 )] * y 個epoch、第( x^0 )+ ( x^1 ) + ( x^2 ) * 5 個epoch,以此類推。
- eta_min:最小學習率。
- last_epoch:設置到哪個epoch就不再調整,預設為-1,到最後個epoch才會從初始學習率開始。
- verbose:預設為False,若為True,則會印出當前學習率。
圖片來源:https://zhuanlan.zhihu.com/p/261134624
ReduceLROnPlateau
- 當某指標(例如loss或accuracy)沒在變化時,調整學習率。
torch.optim.lr_sheduler.ReduceLROnPlateau(optimizer, mode='min', factor=0.1, patience=10,
verbose=False, threshold=0.0001, threshold_mode='rel', cooldown=0, min_lr=0, eps=1e-08)
- optimizer:選擇搭配的優化器。
- mode:設置min表示當監loss不再下降時更新學習率,max則是accuracy不再上升時更新學習率。
- factor:當更新學習率時,lr = lr * factor。
- patience:多少個epoch不變化時,開始更新學習率。
- verbose:預設為False,若為True,則會印出當前學習率。
- cooldown:當更新學習率後,等待多久個epoch再重啟監測。
- min_lr:學習率下限。
- eps:當學習率小於eps則不再更新學習率。
- threshold_mode與threshold搭配使用,詳情見官網。
今日小結
- 設置學習率非常重要,學習率可能導致結果卡在局部最佳解,而不是全局最佳解,又或者卡在鞍點(明天會提到)。
- 今天先跟各位介紹這幾個學習率衰減的方法。個人認為CosineAnnealingWarmRestarts以及CosineAnnealing可以算循環調整的學習率。
- 明天跟各位介紹何謂鞍點以及循環學習率及自訂義學習率的調整。